/*
 * AnyAttribute.java
 *
 * Created on 20 marzo 2004, 10.39
 */

package net.ermannofranco.xml.schema;

import net.ermannofranco.xml.Static;

/**
 * formalizazione del tag anyAttribute.
 * 
 * @author ermanno (ermanno.franco@gmail.com)
 */
public class AnyAttribute extends SchemaTag {
	/**
	 * 
	 */
	private static final long serialVersionUID = 3356196850545546249L;

	// /** costante per skip */
	// public static final int SKIP=2;
	// /** costante per lax */
	// public static final int LAX=1;
	// /** costante per strict */
	// public static final int STRICT=0;

	/**
	 * Creates a new instance of AnyAttribute Protetto
	 * 
	 * @param level
	 *            livello di indentazione
	 * @param container
	 *            tag contenitore
	 */
	protected AnyAttribute(int level, ISchemaTag container) {
		super("anyAttribute", level, container);
	}

	/**
	 * imposta il ns
	 * 
	 * @param ns
	 *            namespace
	 * @return autoref
	 */
	public AnyAttribute setNamespace(String... ns) {
		if (ns == null || ns.length == 0)
			throw new SchemaException("namespace too minimal...");
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < ns.length; i++) {
			sb.append(ns[i]).append(Static.SPACE);
		}
		sb.setLength(sb.length() - 1);
		addAttr("namespace", sb.toString());// qui e' cdata, senza convalida
		return this;
	}

	/**
	 * imposta SKIP, LAX O STRICT
	 * 
	 * @param anyNumber
	 *            tipo di processamento del contenuto. Costante di Process
	 * @return autoref
	 */
	public AnyAttribute processContents(Process p) {
		String processType = null;
		switch (p) {
		case SKIP:
			processType = "skip";
			break;
		case LAX:
			processType = "lax";
			break;
		case STRICT:
			processType = "strict";
			break;
		default:
			throw new SchemaException("Scegliere una costante di Process, "
					+ getClass().getName() + ":(" + getName() + ")");
		}
		addAttr("processContents", processType);
		return this;
	}

	/**
	 * aggiunge un tag Annotation che contiene un tag Documentation
	 * 
	 * @param explanation
	 *            Stringa di documentazione
	 * @return autoriferimento all'oggetto corrente
	 */
	public AnyAttribute addDocumentation(String explanation) {
		addAnnotation().addDocumentation(explanation);
		return this;
	}

	/**
	 * aggiunge un tag Annotation che contiene un tag Documentation
	 * 
	 * @param explanation
	 *            testo della documentazione
	 * @param language
	 *            attributo di xml:lang, seguire le regole di i18n
	 * @return riferimento all'oggetto corrente
	 */
	public AnyAttribute addDocumentation(String explanation, String language) {
		addAnnotation().addDocumentation(explanation, language);
		return this;
	}
}
